home *** CD-ROM | disk | FTP | other *** search
/ Clickx 96 / Clickx 96.iso / software / tools / tool / xbmc-10.1.exe / addons / script.module.pil / lib / PIL / ImageFont.py < prev    next >
Encoding:
Python Source  |  2009-04-06  |  17.0 KB  |  391 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # PIL raster font management
  6. #
  7. # History:
  8. # 1996-08-07 fl   created (experimental)
  9. # 1997-08-25 fl   minor adjustments to handle fonts from pilfont 0.3
  10. # 1999-02-06 fl   rewrote most font management stuff in C
  11. # 1999-03-17 fl   take pth files into account in load_path (from Richard Jones)
  12. # 2001-02-17 fl   added freetype support
  13. # 2001-05-09 fl   added TransposedFont wrapper class
  14. # 2002-03-04 fl   make sure we have a "L" or "1" font
  15. # 2002-12-04 fl   skip non-directory entries in the system path
  16. # 2003-04-29 fl   add embedded default font
  17. # 2003-09-27 fl   added support for truetype charmap encodings
  18. #
  19. # Todo:
  20. # Adapt to PILFONT2 format (16-bit fonts, compressed, single file)
  21. #
  22. # Copyright (c) 1997-2003 by Secret Labs AB
  23. # Copyright (c) 1996-2003 by Fredrik Lundh
  24. #
  25. # See the README file for information on usage and redistribution.
  26. #
  27.  
  28. import Image
  29. import os, string, sys
  30.  
  31. class _imagingft_not_installed:
  32.     # module placeholder
  33.     def __getattr__(self, id):
  34.         raise ImportError("The _imagingft C module is not installed")
  35.  
  36. try:
  37.     import _imagingft
  38.     core = _imagingft
  39.     del _imagingft
  40. except ImportError:
  41.     core = _imagingft_not_installed()
  42.  
  43. # FIXME: add support for pilfont2 format (see FontFile.py)
  44.  
  45. # --------------------------------------------------------------------
  46. # Font metrics format:
  47. #       "PILfont" LF
  48. #       fontdescriptor LF
  49. #       (optional) key=value... LF
  50. #       "DATA" LF
  51. #       binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox)
  52. #
  53. # To place a character, cut out srcbox and paste at dstbox,
  54. # relative to the character position.  Then move the character
  55. # position according to dx, dy.
  56. # --------------------------------------------------------------------
  57.  
  58. ##
  59. # The <b>ImageFont</b> module defines a class with the same name.
  60. # Instances of this class store bitmap fonts, and are used with the
  61. # <b>text</b> method of the <b>ImageDraw</b> class.
  62. # <p>
  63. # PIL uses it's own font file format to store bitmap fonts. You can
  64. # use the <b>pilfont</b> utility to convert BDF and PCF font
  65. # descriptors (X window font formats) to this format.
  66. # <p>
  67. # Starting with version 1.1.4, PIL can be configured to support
  68. # TrueType and OpenType fonts.  For earlier version, TrueType
  69. # support is only available as part of the imToolkit package
  70. #
  71. # @see ImageDraw#ImageDraw.text
  72. # @see pilfont
  73.  
  74. class ImageFont:
  75.     "PIL font wrapper"
  76.  
  77.     def _load_pilfont(self, filename):
  78.  
  79.         file = open(filename, "rb")
  80.  
  81.         for ext in (".png", ".gif", ".pbm"):
  82.             try:
  83.                 fullname = os.path.splitext(filename)[0] + ext
  84.                 image = Image.open(fullname)
  85.             except:
  86.                 pass
  87.             else:
  88.                 if image and image.mode in ("1", "L"):
  89.                     break
  90.         else:
  91.             raise IOError("cannot find glyph data file")
  92.  
  93.         self.file = fullname
  94.  
  95.         return self._load_pilfont_data(file, image)
  96.  
  97.     def _load_pilfont_data(self, file, image):
  98.  
  99.         # read PILfont header
  100.         if file.readline() != "PILfont\n":
  101.             raise SyntaxError("Not a PILfont file")
  102.         d = string.split(file.readline(), ";")
  103.         self.info = [] # FIXME: should be a dictionary
  104.         while True:
  105.             s = file.readline()
  106.             if not s or s == "DATA\n":
  107.                 break
  108.             self.info.append(s)
  109.  
  110.         # read PILfont metrics
  111.         data = file.read(256*20)
  112.  
  113.         # check image
  114.         if image.mode not in ("1", "L"):
  115.             raise TypeError("invalid font image mode")
  116.  
  117.         image.load()
  118.  
  119.         self.font = Image.core.font(image.im, data)
  120.  
  121.         # delegate critical operations to internal type
  122.         self.getsize = self.font.getsize
  123.         self.getmask = self.font.getmask
  124.  
  125. ##
  126. # Wrapper for FreeType fonts.  Application code should use the
  127. # <b>truetype</b> factory function to create font objects.
  128.  
  129. class FreeTypeFont:
  130.     "FreeType font wrapper (requires _imagingft service)"
  131.  
  132.     def __init__(self, file, size, index=0, encoding=""):
  133.         # FIXME: use service provider instead
  134.         self.font = core.getfont(file, size, index, encoding)
  135.  
  136.     def getname(self):
  137.         return self.font.family, self.font.style
  138.  
  139.     def getmetrics(self):
  140.         return self.font.ascent, self.font.descent
  141.  
  142.     def getsize(self, text):
  143.         return self.font.getsize(text)[0]
  144.  
  145.     def getmask(self, text, mode=""):
  146.         return self.getmask2(text, mode)[0]
  147.  
  148.     def getmask2(self, text, mode="", fill=Image.core.fill):
  149.         size, offset = self.font.getsize(text)
  150.         im = fill("L", size, 0)
  151.         self.font.render(text, im.id, mode=="1")
  152.         return im, offset
  153.  
  154. ##
  155. # Wrapper that creates a transposed font from any existing font
  156. # object.
  157. #
  158. # @param font A font object.
  159. # @param orientation An optional orientation.  If given, this should
  160. #     be one of Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM,
  161. #     Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270.
  162.  
  163. class TransposedFont:
  164.     "Wrapper for writing rotated or mirrored text"
  165.  
  166.     def __init__(self, font, orientation=None):
  167.         self.font = font
  168.         self.orientation = orientation # any 'transpose' argument, or None
  169.  
  170.     def getsize(self, text):
  171.         w, h = self.font.getsize(text)
  172.         if self.orientation in (Image.ROTATE_90, Image.ROTATE_270):
  173.             return h, w
  174.         return w, h
  175.  
  176.     def getmask(self, text, mode=""):
  177.         im = self.font.getmask(text, mode)
  178.         if self.orientation is not None:
  179.             return im.transpose(self.orientation)
  180.         return im
  181.  
  182. ##
  183. # Load font file.  This function loads a font object from the given
  184. # bitmap font file, and returns the corresponding font object.
  185. #
  186. # @param filename Name of font file.
  187. # @return A font object.
  188. # @exception IOError If the file could not be read.
  189.  
  190. def load(filename):
  191.     "Load a font file."
  192.     f = ImageFont()
  193.     f._load_pilfont(filename)
  194.     return f
  195.  
  196. ##
  197. # Load a TrueType or OpenType font file, and create a font object.
  198. # This function loads a font object from the given file, and creates
  199. # a font object for a font of the given size.
  200. # <p>
  201. # This function requires the _imagingft service.
  202. #
  203. # @param filename A truetype font file.  Under Windows, if the file
  204. #    is not found in this filename, the loader also looks in Windows
  205. #    <b>fonts</b> directory
  206. # @param size The requested size, in points.
  207. # @param index Which font face to load (default is first available face).
  208. # @param encoding Which font encoding to use (default is Unicode).  Common
  209. #    encodings are "unic" (Unicode), "symb" (Microsoft Symbol), "ADOB"
  210. #    (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman).
  211. #    See the FreeType documentation for more information.
  212. # @return A font object.
  213. # @exception IOError If the file could not be read.
  214.  
  215. def truetype(filename, size, index=0, encoding=""):
  216.     "Load a truetype font file."
  217.     try:
  218.         return FreeTypeFont(filename, size, index, encoding)
  219.     except IOError:
  220.         if sys.platform == "win32":
  221.             # check the windows font repository
  222.             # NOTE: must use uppercase WINDIR, to work around bugs in
  223.             # 1.5.2's os.environ.get()
  224.             windir = os.environ.get("WINDIR")
  225.             if windir:
  226.                 filename = os.path.join(windir, "fonts", filename)
  227.                 return FreeTypeFont(filename, size, index, encoding)
  228.         raise
  229.  
  230. ##
  231. # Load font file.  Same as load, but searches for a bitmap font along
  232. # the Python path.
  233. #
  234. # @param filename Name of font file.
  235. # @return A font object.
  236. # @exception IOError If the file could not be read.
  237. # @see #load
  238.  
  239. def load_path(filename):
  240.     "Load a font file, searching along the Python path."
  241.     for dir in sys.path:
  242.         if Image.isDirectory(dir):
  243.             try:
  244.                 return load(os.path.join(dir, filename))
  245.             except IOError:
  246.                 pass
  247.     raise IOError("cannot find font file")
  248.  
  249. ##
  250. # Load a (probably rather ugly) default font.
  251. #
  252. # @return A font object.
  253.  
  254. def load_default():
  255.     "Load a default font."
  256.     from StringIO import StringIO
  257.     import base64
  258.     f = ImageFont()
  259.     f._load_pilfont_data(
  260.          # courB08
  261.          StringIO(base64.decodestring('''
  262. UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  263. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  264. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  265. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  266. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  267. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  268. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  269. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  270. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  271. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  272. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  273. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA
  274. BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL
  275. AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA
  276. AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB
  277. ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A
  278. BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB
  279. //kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA
  280. AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH
  281. AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA
  282. ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv
  283. AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/
  284. /gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5
  285. AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA
  286. AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG
  287. AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA
  288. BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA
  289. AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA
  290. 2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF
  291. AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA////
  292. +gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA
  293. ////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA
  294. BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv
  295. AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA
  296. AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA
  297. AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA
  298. BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP//
  299. //kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA
  300. AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF
  301. AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB
  302. mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn
  303. AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA
  304. AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7
  305. AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA
  306. Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA
  307. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  308. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  309. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  310. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  311. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  312. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  313. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  314. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  315. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  316. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  317. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  318. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB
  319. //sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA
  320. AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ
  321. AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC
  322. DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ
  323. AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/
  324. +wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5
  325. AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/
  326. ///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG
  327. AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA
  328. BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA
  329. Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC
  330. eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG
  331. AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA////
  332. +gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA
  333. ////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA
  334. BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT
  335. AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A
  336. AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA
  337. Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA
  338. Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP//
  339. //cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA
  340. AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ
  341. AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA
  342. LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5
  343. AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA
  344. AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5
  345. AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA
  346. AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG
  347. AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA
  348. EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK
  349. AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA
  350. pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG
  351. AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA////
  352. +QAGAAIAzgAKANUAEw==
  353. ''')), Image.open(StringIO(base64.decodestring('''
  354. iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u
  355. Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9
  356. M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g
  357. LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F
  358. IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA
  359. Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791
  360. NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx
  361. in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9
  362. SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY
  363. AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt
  364. y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG
  365. ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY
  366. lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H
  367. /Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3
  368. AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47
  369. c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/
  370. /yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw
  371. pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv
  372. oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR
  373. evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA
  374. AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v//
  375. Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR
  376. w7IkEbzhVQAAAABJRU5ErkJggg==
  377. '''))))
  378.     return f
  379.  
  380. if __name__ == "__main__":
  381.     # create font data chunk for embedding
  382.     import base64, os, sys
  383.     font = "../Images/courB08"
  384.     print "    f._load_pilfont_data("
  385.     print "         # %s" % os.path.basename(font)
  386.     print "         StringIO(base64.decodestring('''"
  387.     base64.encode(open(font + ".pil", "rb"), sys.stdout)
  388.     print "''')), Image.open(StringIO(base64.decodestring('''"
  389.     base64.encode(open(font + ".pbm", "rb"), sys.stdout)
  390.     print "'''))))"
  391.